home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / program / passmsrc.arc / PASSM.PAS < prev    next >
Pascal/Delphi Source File  |  1989-02-04  |  47KB  |  1,375 lines

  1. {***************************************************************************}
  2. {* This program is a general purpose PAL assembler. You may copy and use   *}
  3. {* it for personal purposes. No commercial use of this program is allowed  *}
  4. {* without the consent of the author.                                      *}
  5. {* THIS IS THE Atari ST Version                                            *}
  6. {* (c) Copyright 1987,1988 by Erasmo Brenes.                               *}
  7. {***************************************************************************}
  8. program passm (input,output,source,simfile);
  9.  const
  10.   linewidth = 40;
  11.   blank = ' ';  semicol = ';';  comment = '"';
  12.   maxterms = 19;        maxinputs = 22;
  13.   maxpins = 24;         npals   = 23;
  14.   maxcols = 44;         maxouts = 10;
  15.  
  16.  type
  17.   symbol =( ident, int, num, eql, quotes, semicolon, apostrophe,
  18.             leftbrkt, rightbrkt, device, pin, equations,module,flag,
  19.             lftparen,rgtparen,title,node,stype,macro,andoperator,
  20.             oroperator,invert,colon,ends,enable,preset,clear);
  21.   palsymb = ( p10l8,p12l6,p14l4,p16l2,p16l8,p16rx,p12l10,p14l8,p16l6,
  22.               p18l4,p20l2,p20l10,p20l8,p20rx,p22vx);
  23.   tkens = packed array [1..15] of char;
  24.   kind  = (reg, nonreg, bidir, tristate);
  25.   palsize = (input18, input22);
  26.   logic = (high, low);
  27.   trans1typ =
  28.    record
  29.         transfer : array[1..maxpins] of integer
  30.    end;
  31.   outtype =
  32.    record
  33.         outnumb : integer;
  34.         outname : tkens;
  35.         outkind : kind;
  36.         size    : palsize;
  37.         form    : logic;
  38.         matrix  : array [1..maxterms,1..maxcols] of char
  39.    end;
  40.   entrytype =
  41.    record
  42.         name : tkens;
  43.         pinn : integer
  44.    end;
  45.   string2 = packed array [1..4] of char;
  46.   filnam = packed array [1..80] of char;
  47.   ptermtyp = array [1..maxcols] of char;
  48.  
  49.  var
  50.   source,simfile : text;
  51.   token  : tkens;
  52.   palknds : array [1..npals] of char;
  53.   pals    : array [1..npals] of tkens;
  54.   symtable: array [1..maxpins] of entrytype;
  55.   outtable: array [1..11] of outtype;
  56.   palkind : palsymb;
  57.   fusetoinp,fusetopin : array [palsymb] of trans1typ;
  58.   paltyp  : array [1..npals] of palsymb;
  59.   filspc : string[80];
  60.   sym : symbol;
  61.   reserved : array [1..13] of tkens;
  62.   pdevice : tkens;
  63.   wsym : array [1..13] of symbol;
  64.   ptype,ch,tab : char;
  65.   nexout,outindex : integer;
  66.   nexin : integer;
  67.   value,i,j,pointer,iterm,totalterms : integer;
  68.   Abort,empty,pal16,found : boolean;
  69.   ar, sp : ptermtyp;
  70.  
  71.  procedure bgetchar (var ch:char);
  72.   begin
  73.    empty := false;
  74.    if eof(source)
  75.     then begin
  76.           empty := true;
  77.           ch := blank
  78.          end
  79.     else begin
  80.           if eoln(source)
  81.            then begin
  82.                  readln (source);
  83.                  ch := blank
  84.                 end
  85.            else
  86.           if eof(source)
  87.            then begin
  88.                  empty := true;
  89.                  ch := blank
  90.                 end
  91.            else begin
  92.                  read (source,ch);
  93.                  if ch = comment
  94.                   then begin
  95.                         repeat
  96.                         readln (source);
  97.                         if eof(source)
  98.                          then begin
  99.                                 empty := true;  ch := blank
  100.                               end
  101.                          else read (source,ch)
  102.                         until (ch <> comment) or (eof(source))
  103.                        end
  104.                 end
  105.          end
  106.   end; {bgetchar}
  107.  
  108.  procedure numbr;
  109. {this routine always leaves with ch containing the next character!}
  110.   var
  111.    j : integer;
  112.   begin
  113.    sym := int;
  114.    value := 0;  j:= 0;
  115.    repeat
  116.     value := 10*value + (ord(ch) - ord('0'));
  117.     bgetchar (ch);       j:= j + 1
  118.    until not(ch in ['0'..'9'])
  119.   end; {numbr}
  120.  
  121.  procedure gettoken;
  122.   var
  123.    i,j,k : integer;
  124.   begin
  125.    i:= 0;
  126.    while ((ch=blank)or(ch=tab))and(not empty) do bgetchar(ch);
  127.    if (ch in ['A'..'Z'])or(ch in['a'..'z'])or(ch = '-')
  128.     then begin
  129.           repeat
  130.            i:= i + 1;
  131.            token [i]:= ch;      bgetchar(ch)
  132.           until not((ch in ['A'..'Z'])or(ch in['a'..'z'])or(ch in ['0'..'9'])
  133.            or (ch='_')) or empty or (i = 15);
  134.           if not empty
  135.            then begin
  136.                  if (i < 15) then repeat
  137.                                    i:= i + 1; token[i]:= blank
  138.                                   until (i=15);
  139.                  k := 0;
  140.                  for j:=1 to 13 do
  141.                   if token = reserved[j]
  142.                    then k := j;
  143.                  if k = 0
  144.                   then sym := ident
  145.                   else sym := wsym [k]
  146.                 end
  147.          end
  148.     else begin
  149.           if (ch in ['0'..'9'])
  150.            then numbr
  151.            else case ch of
  152.                  '^':  begin
  153.                         sym := num;
  154.                         bgetchar (ch)
  155.                        end;
  156.                  '=':  begin
  157.                         sym := eql;
  158.                         bgetchar (ch)
  159.                        end;
  160.                  ';':  begin
  161.                         sym := semicolon;
  162.                         bgetchar (ch)
  163.                        end;
  164.                  '''': begin
  165.                         sym := apostrophe;
  166.                         bgetchar (ch)
  167.                        end;
  168.                  '`':  begin
  169.                         sym := apostrophe;
  170.                         bgetchar (ch)
  171.                        end;
  172.                  '"':  begin
  173.                         sym := quotes;
  174.                         bgetchar (ch)
  175.                        end;
  176.                  '[':  begin
  177.                         sym := leftbrkt;
  178.                         bgetchar (ch)
  179.                        end;
  180.                  ']':  begin
  181.                         sym := rightbrkt;
  182.                         bgetchar (ch)
  183.                        end;
  184.                  '(':  begin
  185.                         sym := lftparen;
  186.                         bgetchar (ch)
  187.                        end;
  188.                  ')':  begin
  189.                         sym := rgtparen;
  190.                         bgetchar (ch)
  191.                        end;
  192.                  '!':  begin
  193.                         sym := invert;
  194.                         bgetchar (ch)
  195.                        end;
  196.                  '&':  begin
  197.                         sym := andoperator;
  198.                         bgetchar (ch)
  199.                        end;
  200.                  '#':  begin
  201.                         sym := oroperator;
  202.                         bgetchar (ch)
  203.                        end;
  204.                  ':':  begin
  205.                         sym := colon;
  206.                         bgetchar (ch)
  207.                        end;
  208.                  otherwise:
  209.                     begin
  210.                      bgetchar (ch);
  211.                      gettoken { get next token }
  212.                     end
  213.                 end
  214.          end
  215.   end; {gettoken}
  216.  
  217.  procedure semimodule;
  218.   begin
  219.    gettoken;
  220.    while sym = semicolon
  221.     do gettoken;
  222.   end;
  223.  
  224.  procedure search ( kind : integer);
  225.   var
  226.    i,j : integer;
  227.   begin
  228.    case kind of
  229.     1:   begin
  230.           pointer := 0;
  231.           for i:=1 to npals do
  232.            if token = pals[i]
  233.             then pointer := i
  234.          end;
  235.     2:  begin
  236.          j := pointer;
  237.          pointer := 0;
  238.          for i:=1 to 24 do
  239.           with symtable[i] do
  240.            if pinn = j
  241.             then pointer := i
  242.         end;
  243.     3:  begin      { search a signal name for its corresponding pin }
  244.          pointer := 0;  found := false;
  245.          for i:= 1 to maxpins do
  246.           with symtable[i] do
  247.            if token = name
  248.             then begin
  249.                   pointer := pinn; found := true
  250.                  end
  251.         end;
  252.     otherwise:
  253.         writeln ('!!! software error in search procedure')
  254.    end
  255.   end; {search}
  256.  
  257.  procedure start;
  258.   var
  259.    first : integer;
  260.   begin
  261.    while not(sym = equations) and (not Abort) and not(eof(source))do
  262.     begin
  263.      first := nexin + 1;
  264.      if sym = ident
  265.       then begin
  266.             nexin := nexin + 1;
  267.             symtable[nexin].name := token;
  268.             gettoken;
  269.             while sym = ident do
  270.              begin      { get list of identifiers }
  271.               nexin := nexin + 1;
  272.               symtable[nexin].name := token;
  273.               gettoken
  274.